/* Includes */
#include "main.h"
#include "Board.h"
#include "stdio.h"
#include "apm32f4xx_gpio.h"
#include "apm32f4xx_adc.h"
#include "apm32f4xx_misc.h"
#include "apm32f4xx_usart.h"
#include "apm32f4xx_tmr.h"

// 定义状态
typedef enum
{
    STATE_OFF,          // 常灭
    STATE_ON,           // 常亮
    STATE_SLOW_BLINK,   // 慢闪
    STATE_FAST_BLINK    // 快闪
} State;

// 定义事件
typedef enum
{
    EVENT_KEY_PRESS,    // 按键按下
    EVENT_TIMER         // 定时器到时
} Event;

// 定义状态转换结构体
typedef struct
{
    State current_state;    // 当前状态
    Event event;            // 事件
    State next_state;       // 下个状态
    void (*action)(void);   // 动作函数指针
} Transition;

// 动作函数
void turn_off_led(void) { APM_TINY_LEDOff(LED2); }
void turn_on_led(void) { APM_TINY_LEDOn(LED2); }
void toggle_led(void) { APM_TINY_LEDToggle(LED2); }

// 状态转换表
Transition state_table[] =
{
    {STATE_OFF,        EVENT_KEY_PRESS, STATE_SLOW_BLINK, turn_off_led},
    {STATE_OFF,        EVENT_TIMER,     STATE_OFF,        NULL},
    {STATE_SLOW_BLINK, EVENT_KEY_PRESS, STATE_FAST_BLINK, NULL},
    {STATE_SLOW_BLINK, EVENT_TIMER,     STATE_SLOW_BLINK, toggle_led},
    {STATE_FAST_BLINK, EVENT_KEY_PRESS, STATE_ON,         turn_on_led},
    {STATE_FAST_BLINK, EVENT_TIMER,     STATE_FAST_BLINK, toggle_led},
    {STATE_ON,         EVENT_KEY_PRESS, STATE_OFF,        turn_off_led},
    {STATE_ON,         EVENT_TIMER,     STATE_ON,         NULL}
};

// 当前状态
State current_state = STATE_OFF;
volatile uint32_t timer_counter = 0;
volatile uint32_t timer_threshold = 1000;

// 处理事件的函数
void process_event(Event event)
{
    int table_size = sizeof(state_table) / sizeof(Transition);
    for (int i = 0; i < table_size; i++)
    {
        if (state_table[i].current_state == current_state && state_table[i].event == event)
        {
            if (state_table[i].action != NULL)
            {
                state_table[i].action();
            }
            current_state = state_table[i].next_state;
            if (current_state == STATE_SLOW_BLINK)
            {
                timer_threshold = 1000;  // 1秒
            }
            else if (current_state == STATE_FAST_BLINK)
            {
                timer_threshold = 200;   // 0.2秒
            }
            return;
        }
    }
}

// 主函数
int main(void)
{
    // ... 初始化代码 ...
    APM_TINY_LEDInit(LED2);
    APM_TINY_PBInit(BUTTON_KEY1, BUTTON_MODE_GPIO);
    // ... 定时器和串口初始化 ...

    while (1)
    {
        // 检测按键
        if (APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
        {
            process_event(EVENT_KEY_PRESS);
            delay_ms(50);  // 防抖
            while (APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET);  // 等待松开
        }
    }
}

// 定时器中断处理函数
void TMR2_IRQHandler(void)
{
    if (TMR_ReadIntFlag(TMR2, TMR_INT_UPDATE) != RESET)
    {
        TMR_ClearIntFlag(TMR2, TMR_INT_UPDATE);
        timer_counter++;
        if (timer_counter >= timer_threshold)
        {
            timer_counter = 0;
            process_event(EVENT_TIMER);
        }
    }
}


/**
8. 例程怎么工作的？
8.1 启动
程序开始时，LED是常灭状态（STATE_OFF）。

8.2 按键

第一次按：查表，从STATE_OFF跳到STATE_SLOW_BLINK，LED开始慢闪。
第二次按：跳到STATE_FAST_BLINK，LED快闪。
第三次按：跳到STATE_ON，LED常亮。
第四次按：回到STATE_OFF，LED常灭。
8.3 定时器
在慢闪和快闪状态下，每次定时器到时就翻转LED，其他状态无动作。

 */